package top.lshaci.learning.atguigu.interview3.aqs;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * BankDemo
 *
 * @author lshaci
 * @since 1.0.0
 */
public class BankDemo {

    public static void main(String[] args) {
        // 带入一个银行办理业务的案例来模拟我们的AQS如何进行线程的管理和通知唤醒机制
        // 3个线程模拟3个受理窗口办理业务的顾客
        ReentrantLock lock = new ReentrantLock();

        // A就是第一个顾客，此时受理窗口没有任何人，A可以直接去办理
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread come in ==>" + Thread.currentThread().getName());
                try {
                    TimeUnit.MINUTES.sleep(20);
                } catch (InterruptedException ignored) {
                }
            } finally {
                lock.unlock();
            }
        }, "A").start();

        // B是第二个顾客，第二个线程；由于受理业务的窗口只有一个（只能一个线程持有锁），此时B只能等待，进入候客区
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread come in ==>" + Thread.currentThread().getName());
            } finally {
                lock.unlock();
            }
        }, "B").start();

        // C是第三个顾客，第三个线程；由于受理业务的窗口只有一个（只能一个线程持有锁），此时C只能等待，进入候客区
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread come in ==>" + Thread.currentThread().getName());
            } finally {
                lock.unlock();
            }
        }, "C").start();

    }

}
